## ИМПОРТ БИБЛИОТЕК ----------------------------------------------------------------
import os
import subprocess
import datetime
from libqtile import hook

from libqtile import bar, layout, widget
from libqtile.config import Click, Drag, Group, Key, Match, Screen
from libqtile.lazy import lazy
from libqtile.utils import guess_terminal

## АВТОЗАПУСК ----------------------------------------------------------------------
@hook.subscribe.startup_once
def autostart():
    home = os.path.expanduser('~/.config/qtile/autostart.sh')
    subprocess.call([home])


## СДЕЛАТЬ ДИАЛОГОВЫЕ ОКНА ПЛАВАЮЩИМИ ----------------------------------------------
@hook.subscribe.client_new
def floating_dialogs(window):
    dialog = window.window.get_wm_type() == 'dialog'
    transient = window.window.get_wm_transient_for()
    if dialog or transient:
        window.floating = True


## КЛАВИША МОДИФИКАТОР -------------------------------------------------------------
mod = "mod4"


terminal = guess_terminal()

## ХОТКЕИ --------------------------------------------------------------------------
keys = [
    # Управление фокусом
    Key([mod], "left", lazy.layout.left(), desc="Move focus to left"), # Фокус влево
    Key([mod], "right", lazy.layout.right(), desc="Move focus to right"), # Фокус вправо
    Key([mod], "down", lazy.layout.down(), desc="Move focus down"), # Фокус вниз
    Key([mod], "up", lazy.layout.up(), desc="Move focus up"), # Фокус вверх
    #Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"), # Переключить фокус
    Key([mod], "f", lazy.window.toggle_fullscreen(), desc="Toggle fullscreen"),
    # Перемещение окон
    Key([mod, "shift"], "left", lazy.layout.shuffle_left(), desc="Move window to the left"), # Переместить окно влево
    Key([mod, "shift"], "right", lazy.layout.shuffle_right(), desc="Move window to the right"), # Переместить окно в право
    Key([mod, "shift"], "down", lazy.layout.shuffle_down(), desc="Move window down"), # Переместить окно вниз
    Key([mod, "shift"], "up", lazy.layout.shuffle_up(), desc="Move window up"), # Переместить окно вверх

    # Изменение размера окна
    Key([mod, "control"], "left", lazy.layout.grow_left(), desc="Grow window to the left"), # Увеличить окно влево
    Key([mod, "control"], "right", lazy.layout.grow_right(), desc="Grow window to the right"), # Увеличить окно вправо
    Key([mod, "control"], "down", lazy.layout.grow_down(), desc="Grow window down"), # Увеличить окно вниз
    Key([mod, "control"], "up", lazy.layout.grow_up(), desc="Grow window up"), # Увеличить окно вверх
    Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"), # Вернуть все взад

    # Раскладка клавиатуры
    Key([mod], "space", lazy.widget["keyboardlayout"].next_keyboard(), desc="Next keyboard layout."),

    # Управление звуком
    Key([], 'XF86AudioLowerVolume', lazy.spawn('amixer sset Master,0 5%-')),
    Key([], 'XF86AudioRaiseVolume', lazy.spawn('amixer sset Master,0 5%+')),
    Key([], 'XF86AudioMute', lazy.spawn('amixer sset Master,0 toggle')),

    # Яркость экрана
    Key([], 'XF86MonBrightnessDown', lazy.spawn('light -p -U 10')),
    Key([], 'XF86MonBrightnessUp', lazy.spawn('light -p -A 10')),

    # PrintScreen
    Key([], 'Print', lazy.spawn('/usr/bin/grim /home/artem/Screenshots/{0}.png'.format(
     str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")).replace(" ","_")))),
    # Lock Screen
    Key([mod, "shift"], "l", lazy.spawn('swaylock --clock -S --indicator --effect-pixelate 10 --effect-blur 10x1')),

    Key(
        [mod, "shift"],
        "Return",
        lazy.layout.toggle_split(),
        desc="Toggle between split and unsplit sides of stack",
    ),

    Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"),
    Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
    Key([mod, "shift"], "q", lazy.window.kill(), desc="Kill focused window"),
    Key([mod, "shift"], "c", lazy.reload_config(), desc="Reload the config"),
    Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown Qtile"),
    Key([mod], "d", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
]


## ПЕРЕКЛЮЧЕНИЕ ВОРКСПЕЙСОВ И ПЕРЕМЕЩЕНИЕ ОКОН ПО НИМ ------------------------------
groups = [Group(i) for i in "123456789"] # Имена воркспейсов

groups = [
    Group("1", label = "1"),
    Group("2", label = "2"),
    Group("3", label = "3"),
    Group("4", label = "4"),
    Group("5", label = "5"),
    Group("6", label = "6"),
    Group("7", label = "7"),
    Group("8", label = "8"),
    Group("9", label = "9"),
]

for i in groups:
    keys.extend(
        [
            # mod + номер вокспейса = переход на этот воркспейс
            Key(
                [mod],
                i.name,
                lazy.group[i.name].toscreen(),
                desc="Switch to group {}".format(i.name),
            ),
            # mod + shift + номер воркспейса = перенос окна на этот воркспейс
            Key(
                [mod, "shift"],
                i.name,
                lazy.window.togroup(i.name, switch_group=True),
                desc="Switch to & move focused window to group {}".format(i.name),
            ),
        ]
    )


## МАКЕТЫ (в скобках прописываются параметры, толщина бордера, цвета...) -----------
layouts = [
    # layout.Columns(),
    # layout.Max(), # Фуллскрин
    # layout.Stack(num_stacks=2), #Какая то фигня
    layout.Bsp(border_focus = "#f9f9f9", border_normal = "#263238", border_width=1, margin = 10), # Как в bspwm
    # layout.Matrix(), # В 2 колонки
    # layout.MonadTall(), # Как в dwm
    # layout.MonadWide(), # Как в dwm только по горизонтали
    # layout.RatioTile(), # Окна мазайкой 3х3, 4х4 ...
    # layout.Tile(), # Как в dwm
    # layout.TreeTab(), # Вертикальный монокль с заголовками
    # layout.VerticalTile(), # Окна открываются вертикально
    # layout.Zoomy(), # Как в dwm ток мастер окно большое
]

## ОБЩИЕ ПАРАМЕТРЫ ВИДЖЕТОВ НА ПАНЕЛИ ----------------------------------------------
widget_defaults = dict(
    font="JetBrainsMono",
    fontsize=16,
    padding=5,
)
extension_defaults = widget_defaults.copy()

## ВИДЖЕТЫ НА ПАНЕЛИ И ИХ ПАРАМЕТРЫ ------------------------------------------------
screens = [
    Screen(
        wallpaper='~/Изображения/minimal.png',
        wallpaper_mode='stretch',
        bottom=bar.Bar( # Расположение бара
            [
                widget.CurrentLayout(), # Текущий макет
                widget.GroupBox(borderwidth=2, # Толщина рамки
                    highlight_method='block', # Метод выделения активного воркспейса
                    block_highlight_text_color='#263238', # Цвет текста активного воркспейса
                    this_current_screen_border="#f9f9f9", # Цвет фона активного воркспейса
                    rounded=False,
                    ), # Иконки воркспейсов
                widget.Prompt(), # Виджет выполнения команд
                widget.WindowName(max_chars=60), # Имя окна
                widget.Chord(
                    chords_colors={
                        "launch": ("#ff0000", "#ffffff"),
                    },
                    name_transform=lambda name: name.upper(),
                ),

                widget.OpenWeather(location='Volgograd', format=' {main_temp}°', 
			app_key="e434b5435a979de6e155570590bee89b",),
                widget.Spacer(length=5), # Виджет пробела
                widget.CheckUpdates(custom_command='pamac checkupdates',
                display_format='UPDATES  {updates}',
                no_update_string='UPDATES  0'), # Виджет обновлений пакетов
                widget.Spacer(length=5), # Виджет пробела
                widget.TextBox(text="", padding=0),
                widget.Volume(padding=5), # Виджет громкости пульсы
                widget.Spacer(length=10), # Виджет пробела

                widget.KeyboardLayout(configured_keyboards=['us', 'ru'],
                                    update_interval=1),
                widget.LaunchBar(progs=[('', '/usr/bin/grim /home/artem/Screenshots/{0}.png'.format(
                               str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")).replace(" ","_")))], icon_size='15px'),
                widget.Battery(discharge_char='D',charge_char='C',empty_char='E'),
                widget.CPU(),
                widget.Spacer(length=3), # Виджет пробела
                widget.StatusNotifier(), # Виджет трейбар
                widget.Spacer(length=5), # Виджет пробела
                widget.Clock(format="%Y-%m-%d %a %H:%M %p", padding=1), # Время и дата
                widget.Spacer(length=5), # Виджет пробела
                widget.QuickExit(default_text=''), # Кнопка выключения
            ],
            30, # Высота панели
            border_width=[5, 25, 5, 25],  # Толщина рамок панели
            border_color=["263238", "263238", "263238", "263238"],  # Цвет рамок панели
            margin=0, # Гапсы бара
            background="#263238", # Цвет фона панели
            opacity=1 # Прозрачность бара
        ),
    ),
]

# Drag floating layouts.
mouse = [
    Drag([mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()),
    Drag([mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()),
    Click([mod], "Button2", lazy.window.bring_to_front()),
]

dgroups_key_binder = None
dgroups_app_rules = []  # type: list
follow_mouse_focus = True
bring_front_click = False
cursor_warp = False
floating_layout = layout.Floating(
    float_rules=[
        # Run the utility of `xprop` to see the wm class and name of an X client.
        *layout.Floating.default_float_rules,
        Match(wm_class="confirmreset"),  # gitk
        Match(wm_class="makebranch"),  # gitk
        Match(wm_class="maketag"),  # gitk
        Match(wm_class="ssh-askpass"),  # ssh-askpass
        Match(title="branchdialog"),  # gitk
        Match(title="pinentry"),  # GPG key password entry
    ]
)
auto_fullscreen = True
focus_on_window_activation = "smart"
reconfigure_screens = True

# If things like steam games want to auto-minimize themselves when losing
# focus, should we respect this or not?
auto_minimize = True

# When using the Wayland backend, this can be used to configure input devices.
wl_input_rules = None

# XXX: Gasp! We're lying here. In fact, nobody really uses or cares about this
# string besides java UI toolkits; you can see several discussions on the
# mailing lists, GitHub issues, and other WM documentation that suggest setting
# this string if your java app doesn't work correctly. We may as well just lie
# and say that we're a working one by default.
#
# We choose LG3D to maximize irony: it is a 3D non-reparenting WM written in
# java that happens to be on java's whitelist.
wmname = "LG3D"
